package org.zoomdev.zoom.lock.annotations;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 标注方法之后，表示方法调用会根据计算的key上锁
 * <pre>
 *
 * 如下方法定义：
 * @LockKey("{id}")
 * Shop getShop(Integer id)
 *
 *
 * </pre>
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface LockKey {

    /**
     * 描述cache的key,上锁key
     *
     *
     * <pre>
     * 针对pojo类型参数
     * @LockKey(key="key:{$1.id}:{$2.name}")
     * List<User> queryUser(QueryUserRequest request,QueryUserParam param);
     *
     * @LockKey(key="key:{request.id}:{param.name}")
     * List<User> queryUser(QueryUserRequest request,QueryUserParam param);
     * 其中第二种方法需要打开java编译参数-parameters
     *
     * 针对非pojo类型
     * @LockKey(key="key:{$1}:{$2}")
     * List<User> queryUserById(Integer id,String name);
     *
     * @LockKey(key="key:{id}:{name}")
     * List<User> queryUserById(Integer id,String name);
     *
     * 如果有参数，而value()为空的话，则会使用默认toString方法创建key
     *
     *
     * </pre>
     */
    String value() default "";

    /**
     * 是否轻量,如果是则使用cas操作 ,适合于竞争很少的情况, 如何有并发操作则直接出错
     *
     * @return
     */
    boolean cas() default false;


    /**
     * 报错信息, 只有在cas为true的时候才有效
     *
     * @return
     */
    String message() default "操作繁忙，请稍后重试";
}
